﻿var debug_mode = false;

var Server = new Object();

Server.ROW_NUMBER = 8;
Server.COLUMN_NUMBER = 8;
Server.ITEM_NUMBER = 6;

Server.itemList = [];	// Data của bản cờ

Server.tmp_item_list = [];

Server.createRandomData = function(){
	console.log("Server: create random data");
	
	var data = [];
	
	// Tạo RANDOM các quân cờ
	  for (var i = 0 ; i < Server.ROW_NUMBER ; i++) 
	  {
		  data[i] = [];
		  for (var j = 0 ; j < Server.COLUMN_NUMBER ; j++) 
		  {
			  var nb_icon = Math.ceil(Math.random() * Server.ITEM_NUMBER);

			  if (i > 1) {
				  while(data[i-2][j] == nb_icon && data[i-1][j] == nb_icon){
					  nb_icon = Math.ceil(Math.random() * Server.ITEM_NUMBER);
				  }
			  }
			  
			  if (j > 1) {
				  while(data[i][j-2] == nb_icon && data[i][j-1] == nb_icon){
					  nb_icon = Math.ceil(Math.random() * Server.ITEM_NUMBER);

					  if (i > 1) {
						  while(data[i-2][j] == nb_icon && data[i-1][j] == nb_icon){
							  nb_icon = Math.ceil(Math.random() * Server.ITEM_NUMBER);
						  }
					  }

				  }
			  }

			  data[i][j] = nb_icon;
		  }
	  }  
	  
	  for (var i = 0 ; i < Server.ROW_NUMBER ; i++) 
	  {
		  Server.itemList[i] = [];
		  for (var j = 0 ; j < Server.COLUMN_NUMBER ; j++)
		  { 
			  Server.itemList[i][j] = data[i][j];
		  }
	  }
		  
	  return data;
}

/*
 * Move item và check xem nước đó có ăn hay không
 * Return
 * 		- result.status: có ăn hay không
 * 		- result.item_list: list item đánh dấu bàn cờ
 */
Server.moveItem = function(row, column, new_row, new_column)
{
	console.log("Server: move item (" + row + "," + column +") -> (" + new_row + ", "+ new_column + ")");
	
	// Hoán vị 2 quân cờ
	var item = Server.itemList[row][column];
	var new_item = Server.itemList[new_row][new_column];
	
	Server.itemList[row][column] = new_item;
	Server.itemList[new_row][new_column] = item;
	
	var result = {}; 
		
	result = Server.verify_all_item();
	
//	result.finishItems = Server.checkFinishedItem();
	
	if(result.status)		
	{
		result.tmpItemList = Server.tmp_item_list;
		result.itemList = Server.createNewItems();		
	}
	else // Nếu move ko ăn, revert lại vị trí 2 quân cờ
	{
		Server.itemList[row][column] = item;
		Server.itemList[new_row][new_column] = new_item;
	}
	
	console.log("Result: ", result);
	
	return result;
}

/*
 * Check xem nước đó có ăn hay không
 * Return
 * 		- result.status: có ăn hay không
 * 		- result.item_list: list item đánh dấu bàn cờ
 */
Server.checkAllItems = function(){
	var result = {}; 
	
	result = Server.verify_all_item();
	
	//result.finishItems = Server.checkFinishedItem();
	
	if(result.status)		
	{
		result.tmpItemList = Server.tmp_item_list;
		result.itemList = Server.createNewItems();		
	}
	
	console.log("Result: ", result);
	
	return result;
}

/*
 * Check tất cả các quân cờ xem có quân nào ăn được hay không. Return true | false
 */
Server.verify_all_item = function() {
	
	var result = {status:false};
	result.finishItems = [];
	
	for (var i = 0; i <= Server.ITEM_NUMBER; i++) {
		result.finishItems[i] = 0;
	}
	
	for (var i = 0; i < Server.ROW_NUMBER; i++) {
		Server.tmp_item_list[i] = [];
		
		for (var j = 0; j < Server.COLUMN_NUMBER; j++) {
			Server.tmp_item_list[i][j] = false;
		}
	}

	for (var i = 0; i < Server.ROW_NUMBER; i++) {
		for (var j = 0 ; j < Server.COLUMN_NUMBER; j++) {
			if (Server.verify_item(i, j)) {
				result.status = true;
			}
		}
	}
	
	// Set value = 0 cho những item được ăn
	for (var i = 0; i < Server.ROW_NUMBER; i++) {
		for (var j = 0 ; j < Server.COLUMN_NUMBER; j++) {
			if (Server.tmp_item_list[i][j]) {   
				result.finishItems[Server.itemList[i][j]]++;
				Server.itemList[i][j] = 0;
			}          
		}
	}
	
	console.log("Server: check all item có ăn hay không => ", result);
	
	return result;
};

/*
 * Check quân cờ tại vị trí (row, column) xem có ăn được hay không
 * Result :
 * 		- true : nếu ăn được
 * 		- false: nếu không ăn được
 */
Server.verify_item = function(row, column) {
	var result = false;
  
	var current_item_value = Server.itemList[row][column];
  
	var vertical_item_num = 1;
	var horizontal_item_num = 1;
  
	var i;
	
//	console.log("item (" + row + "," + column + ") : " + current_item_value);
	
	// Check dọc xuống
	if (!Server.tmp_item_list[row][column]) {
		i = 1;
		while(row + i < Server.COLUMN_NUMBER && Server.itemList[row+i][column] == current_item_value && !Server.tmp_item_list[row+i][column]) {
			vertical_item_num++;
			i++;
		}
    
		if (vertical_item_num >= 3) {	// Nếu ăn theo hàng dọc (quân ăn >= 3)
			result = true;
			
			Server.tmp_item_list[row][column] = true;
	      
			// Đánh dấu những quân bị ăn vào mảng Server.tmp_item_list
			i = 1;
			while(row+i < Server.COLUMN_NUMBER && Server.itemList[row+i][column] == current_item_value) {
				Server.tmp_item_list[row+i][column] = true;
				i++;
			} 
		}
	}


	// Check ngang
	if (!Server.tmp_item_list[row][column]) {
		i = 1;
    
		while(column + i < Server.ROW_NUMBER && Server.itemList[row][column + i] == current_item_value && !Server.tmp_item_list[row][column + i]) {
			horizontal_item_num++;
			
			i++;
		}

		if (horizontal_item_num >= 3) {	// Nếu ăn theo hàng ngang (quân ăn >= 3)
			result = true;

			Server.tmp_item_list[row][column] = true;
      
			// right
			i = 1;
			while(column+i < Server.ROW_NUMBER && Server.itemList[row][column+i] == current_item_value) {
	    	  // VH add
				Server.tmp_item_list[row][column+i] = true;
				i++;
			} 
		}
	} 
  
	//console.log("check_right_item(" + row + ", " + column + ") => " + result);
	return result;
};

/*
 * Tạo dữ liệu item cho những vị trí trống
 */
Server.createNewItems = function() {
	
	for (var i = Server.ROW_NUMBER-1; i >= 0 ; i--) {
		for (var j = 0 ; j < Server.COLUMN_NUMBER; j++) {
			if (Server.itemList[i][j] == 0) {
				console.log("add new item to (" + i + ", " + j + ")");
				
				// look above for an icon to fill the hole
				var k = 1;
				while((i - k) >= 0 && Server.itemList[i-k][j] == 0) {
					k++;
				}
				
				// Random quân tại vị trí trống	
				if ((i - k) < 0) {  
					// no icon found above : create random new icon
					var random_icone = Math.ceil(Math.random() * Server.ITEM_NUMBER);
      
					Server.itemList[i][j] = random_icone;
				} 
				else 	// Chuyển quân trên xuống quân dưới
				{
					Server.itemList[i][j] = Server.itemList[i-k][j];
					Server.itemList[i-k][j] = 0;
				}
			}
		}
	}
	
	var  data = [];
	for (var i = 0 ; i < Server.ROW_NUMBER ; i++) 
	{
		data[i] = [];
		  for (var j = 0 ; j < Server.COLUMN_NUMBER ; j++)
		  { 
			  data[i][j] = Server.itemList[i][j];
		  }
	}
	
	console.log("Create new items: ", data);
	
	return data;
};

Server.checkFinishedItem = function(){
	var items = [];
	var i, j;
	
	for(i=0; i < Server.ITEM_NUMBER; i++)
	{
		items[i] = 0;
	}
	
	// Check items
	for (i = 0 ; i < Server.ROW_NUMBER ; i++) 
	{
		//console.log("Row: ", Server.tmp_item_list[i]);
		//console.log("Row: ", Server.itemList[i]);
		  for (j = 0 ; j < Server.COLUMN_NUMBER ; j++)
		  { 
			  if(Server.tmp_item_list[i][j])
			  {
				  items[Server.itemList[i][j]]++;
			  }
		  }
	}
	
	return items;
}
